﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Controller;
using Interfaces;
using Model;
using System.Threading;



namespace GUI
{
    public partial class FrmUdregner : Form
    {
       private vandspareSystem VandspareSystem;
       List<modul> Tekstboxliste;
       FrmSplash splash = null;
       Thread tjekDB;

      class modul
       {
           public TextBox txt;
           public Label label;

           public modul(string txt)
           {
               this.txt = new TextBox();
               label = new Label();
               label.Width = 210;
               this.label.Text = txt;
           }
       }


      // JIM
      private void splashStatus(string stat)
      {
          splash.setStatus(stat);
          splash.Update();
      }

      // JIM
      private void splashStatus(int pct)
      {
          splash.SetProgress(pct);
          splash.Update();
      }


        //Låser Virksomhedstype-comboboxen op!
      private void unlock()
      {
         cboVirkType.Enabled = true;
         btnVirkType.Enabled = true;
      }


        public FrmUdregner()
        {

            splash = new FrmSplash();
            splash.Show();
            splash.Update();

            splashStatus("Indlæser komponenter... ");
            InitializeComponent();
            splashStatus("Indlæser komponenter... OK");
            splashStatus(10);
            splashStatus("Opretter Vandsparesystem...  ");
            VandspareSystem = new vandspareSystem();
            splashStatus("Opretter Vandsparesystem...  OK");
            splashStatus(20);

            //Låser Combobox virksomhedstype
            if (cboFindKunde.SelectedIndex == -1)
            {
                cboVirkType.Enabled = false;
                btnVirkType.Enabled = false;
            }

            //Låser beregn-knappen
            if (cboVirkType.SelectedIndex == -1)
            {
                btnBeregn.Enabled = false;
            }

            //Låser opret-tilbuds-knappen
            btnOpretTilbud.Enabled = false;


            splashStatus("Opretter forbindelse til databasen...  ");
            if (VandspareSystem.CheckDBForbindelse())       //hvis der ikke er forbindelse ventes der på timeout her
            {
                splashStatus("Indlæser data...  ");
                VandspareSystem.DBConnect();
                splashStatus(40);
                VandspareSystem.FyldCollections();
                splashStatus(50);
              
                Tekstboxliste = new List<modul>();
                FyldTextBoxListe();

                splashStatus(60);

                lblStatus.Text = "Klar";
                OpdaterCombobox();
                splashStatus(70);
            }
            else
            {
                btnBeregn.Enabled = btnOpretTilbud.Enabled = btnVirkType.Enabled = false;
                lblStatus.Text = "Fejl! - Ingen forbindelse til databasen";
                timerTestDB.Stop(); timerTestDB.Start();
            }
            splashStatus("Opretter forbindelse til databasen...  OK");
            splashStatus(100);
            splash.Close();
            int db = VandspareSystem.TjekDB();
            if (db == 1)
            {
                MessageBox.Show("BEMÆRK! - Der kunne ikke oprettes forbindelse til serveren! \r\n Programmet er startet med backup server! \r\n Alle funktioner virker, men de indtastede oplysninger gemmes ikke!");
            }
            else if (db == -1)
            {
                MessageBox.Show("Der kan ikke oprettes forbindelse til databasen. Kontakt administrator!");
            }
        }


        private void ClearResultatBoxe()
        {
            txtVandSparet.Clear();
            txtVandSparetProcent.Clear();
            txtBesparelseSamletVandforbrug.Clear();
            txtBesparelsePerson.Clear();
            txtBesparelseKr.Clear();
        }


        private void ClearKundeBoxe()
        {
            txtNavn.Clear();
            txtBy.Clear();
            txtPostNr.Clear();
            txtGade.Clear();
        }


        private void FyldTextBoxListe()
        {
            Tekstboxliste.Add(new modul("Antal brugere:"));
            Tekstboxliste.Add(new modul("Målt forbrug UDEN Robolator i liter/min:"));
            Tekstboxliste.Add(new modul("Målt forbrug MED Robolator i liter/min:"));
            Tekstboxliste.Add(new modul("Sidste års vandforbrug i m3:"));
            Tekstboxliste.Add(new modul("Vandpris i Kr/liter:"));
            Tekstboxliste.Add(new modul("Vandafgift i Kr/liter:"));
        }


        private void loadmoduler()
        {
            panel.Controls.Clear();
            for (int i = 0; i < Tekstboxliste.Count; i++)
            {
                Tekstboxliste[i].label.Location = new Point(10, (i + 0) * 30);
                Tekstboxliste[i].txt.Location = new Point(225, (i + 0) * 30);
                
                this.panel.Controls.Add(Tekstboxliste[i].label);
                this.panel.Controls.Add(Tekstboxliste[i].txt);
            }
        }


        public void OpdaterCombobox()
        {
            cboFindKunde.Items.Clear();
            if (VandspareSystem.KundeCount() != -1)
            {

                cboFindKunde.Items.Clear();

                for (int i = 1; i < VandspareSystem.KundeCount(); i++)
                {
                    cboFindKunde.Items.Add(VandspareSystem.FindKundenumre(i).ToString() + " - " + VandspareSystem.FindKundenavne(i));
                }
            }
        }


        // AØ
        public void OpdaterVirksomhedsdataBox(int kundenr)
        {
            cboVirkType.Items.Clear();

            for (int i = 0; i < VandspareSystem.KundeDataCount(kundenr); i++)
            {
                cboVirkType.Items.Add(VandspareSystem.FindVirksomhedsDataNavn(i, kundenr).ToString());
            }
        }


        private void afslutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tjekDB.Abort();
            tjekDB.Join();
            Close();
        }


        private void btnOpretTilbud_Click(object sender, EventArgs e)
        {
            try
            {
            FrmTilbud frmtilbud = new FrmTilbud(VandspareSystem, Convert.ToDouble(txtBesparelseKr.Text));
            frmtilbud.ShowDialog();
            this.BringToFront();
            }
            catch (Exception)
            {
               timerTestDB.Stop(); timerTestDB.Start();
               lblStatus.Text="Vælg føst kunde og virksomhedstype - og lav en beregning";
            }
        }


        private void opretTilbudToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmTilbud frmtilbud = new FrmTilbud(VandspareSystem, 0); // TJEK TJEK TJEK
            frmtilbud.ShowDialog();
            this.BringToFront(); 
        }


        private void opretArtiklerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmOpretArtikel frmOpretArtikel = new FrmOpretArtikel(VandspareSystem);
            frmOpretArtikel.ShowDialog();
            this.BringToFront(); 
        }


        private void findArtiklerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmFindArtikel frmFindArtikel = new FrmFindArtikel(VandspareSystem);
            frmFindArtikel.ShowDialog();
            this.BringToFront();  
        }


        private void opretKunderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmOpretKunde frmOpretKunde = new FrmOpretKunde(VandspareSystem);
            frmOpretKunde.ShowDialog();
            if (frmOpretKunde.DialogResult == DialogResult.OK)
            {
                OpdaterCombobox();
                this.BringToFront();
            }
        }


        private void findKunderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmHaandtérKunde frmFindKunde = new FrmHaandtérKunde(VandspareSystem);
            frmFindKunde.ShowDialog();
            if (frmFindKunde.DialogResult == DialogResult.OK)
            {
                btnOpretTilbud.Enabled = false;
                btnBeregn.Enabled = false;
                cboVirkType.Enabled = false;
                btnVirkType.Enabled = false;
                cboVirkType.SelectedIndex = -1;
                ClearResultatBoxe();
                if (btnVirkType.Enabled == true)
                {

                    Tekstboxliste.Clear();
                }
                ClearKundeBoxe();
                panel.Controls.Clear();
                cboFindKunde.SelectedIndex = -1;
                cboVirkType.SelectedIndex = -1;

                this.BringToFront();
            }
        }


        //************************************************Jesper, Jim - LAV VANDSPARE UDREGNING********************************************
         // Det virker så man ikke skal trykke 2 efter der er lavet ændringer - Jim 
        private void btnBeregn_Click(object sender, EventArgs e)
        {
            
            PictureBox[] piclist = new PictureBox[Tekstboxliste.Count];
            
            for (int i = 0; i < Tekstboxliste.Count; i++)
            {
                piclist[i] = lavPic(i, Tekstboxliste[i].txt.Location);
            }

            foreach (Control con in panel.Controls)
                if (con.GetType().Equals(typeof(PictureBox)))
                    con.Visible = false;
           
            int samletProcent = 0;

            if (cboFindKunde.SelectedIndex == -1 || cboVirkType.SelectedIndex == -1)
            {
                timerTestDB.Stop(); timerTestDB.Start();
                lblStatus.Text = "Fejl!: Vælg venligst en kunde og en virksomhedstype!";
            }
           
            else
            {            
                    int point = 0;

                    for (int i = 0; i < Tekstboxliste.Count; i++)
                    {

                        if (i > 5 || i == 0)
                        {
                            bool res;
                            int attribut;
                            res = int.TryParse(Tekstboxliste[i].txt.Text, out attribut);
                            if (!res || Tekstboxliste[i].txt.Text == "0")
                            {
                                ToolTip toolTip = new ToolTip();
                                toolTip.IsBalloon = true;
                                if (Tekstboxliste[i].txt.Text == "0")
                                    toolTip.SetToolTip(piclist[i], "Må ikke være 0");
                                else toolTip.SetToolTip(piclist[i], "Må ikke indeholde bogstaver");

                                    lblStatus.Text = "Fejl i indtastning!";
                                    btnOpretTilbud.Enabled = false;
                                    piclist[i].Visible = true;
                                    point++;
                            }
                            else piclist[i].Visible = false;
                        }
                        else
                        {
                        bool res2;
                        double attribut2;
                        res2 = double.TryParse(Tekstboxliste[i].txt.Text, out attribut2);
                        if (!res2 || Tekstboxliste[i].txt.Text == "0")
                        {
                            ToolTip toolTip = new ToolTip();
                            toolTip.IsBalloon = true;
                            if (Tekstboxliste[i].txt.Text == "0")
                                toolTip.SetToolTip(piclist[i], "Må ikke være 0");
                            else toolTip.SetToolTip(piclist[i], "Må ikke indeholde bogstaver");
                                lblStatus.Text = "Fejl i indtastning!";
                                btnOpretTilbud.Enabled = false;
                                piclist[i].Visible = true;
                                point++;
                            
                        }
                        else piclist[i].Visible = false;  
                        }
                    }
                    panel.Controls.AddRange(piclist);
                    if (point == 0)
                    {
                        for (int i = 6; i < Tekstboxliste.Count; i++)
                        {
                            samletProcent += Convert.ToInt32(Tekstboxliste[i].txt.Text);
                        }

                        if (samletProcent < 100)
                        {
                            for (int i = 6; i < Tekstboxliste.Count; i++)
                            {
                                samletProcent = samletProcent + (Convert.ToInt32(Tekstboxliste[i].txt.Text));
                                double nyvaerdi = Convert.ToDouble(Tekstboxliste[i].txt.Text);
                                VandspareSystem.NyInstVaerdi(nyvaerdi, i);
                            }
                            // Kør udregningen
                            IVandspareudregning udregning = VandspareSystem.AendreVirksomhedsdataVaerdier(Convert.ToInt32(Tekstboxliste[0].txt.Text), Convert.ToDouble(Tekstboxliste[1].txt.Text), Convert.ToDouble(Tekstboxliste[2].txt.Text), Convert.ToDouble(Tekstboxliste[3].txt.Text), Convert.ToDouble(Tekstboxliste[4].txt.Text), Convert.ToDouble(Tekstboxliste[5].txt.Text));
                            txtVandSparet.Text = udregning.LtrVandSparet.ToString("F2");
                            txtVandSparetProcent.Text = udregning.SparePct1.ToString("F2");
                            txtBesparelseSamletVandforbrug.Text = udregning.BesparelseAfSamletVandforbrug.ToString("F2");
                            txtBesparelseKr.Text = udregning.BesparelseKr.ToString("F2");
                            txtBesparelsePerson.Text = udregning.BesparelsePrPersonKr.ToString("F2");

                            timerTestDB.Stop();
                            timerTestDB.Start();
                            lblStatus.Text = "Udregning udført";
                            btnOpretTilbud.Enabled = true;
                        }
                        else
                        {
                            timerTestDB.Stop(); timerTestDB.Start();
                            lblStatus.Text = "Fejl - Samlet % er over 100";
                            btnOpretTilbud.Enabled = false;
                        }
                    }
                }
        }


        // Jim
        private PictureBox lavPic(int i, Point point)
        {
            PictureBox pic = new PictureBox();
            pic.ImageLocation = picPath.ImageLocation;
            pic.Image = picPath.Image;
            pic.Visible = false;
            pic.Enabled = true;
            pic.SizeMode = PictureBoxSizeMode.StretchImage;
            pic.BorderStyle = BorderStyle.None;
            pic.Size = new System.Drawing.Size(22, 22);    
            pic.Location = new Point(335, point.Y); //fordi den ellers rykker sig i forhold til hvor meget der er scollet
            pic.TabStop = false;
            return pic;
        }

        //************************************************Jesper - FIND KUNDE********************************************
        private void cboFindKunde_SelectedIndexChanged(object sender, EventArgs e)
        {
            valgtKunde();
        }


        private void valgtKunde()
        {
            if (cboFindKunde.SelectedIndex != -1)
            {
                unlock();
                btnBeregn.Enabled = false;
                btnOpretTilbud.Enabled = false;
                int kundenr = VandspareSystem.FindKundenumre(cboFindKunde.SelectedIndex + 1);

               IKunde kunde = VandspareSystem.FindKunde(kundenr);

                //Udskriv kunde-oplysninger
                txtNavn.Text = kunde.Navn.ToString();
                txtGade.Text = kunde.Adresse.ToString();
                txtPostNr.Text = kunde.Postnr.ToString();
                txtBy.Text = kunde.By.ToString();

                if (cboFindKunde.SelectedIndex != -1)
                {
                    cboVirkType.SelectedIndex = -1;
                    ClearResultatBoxe();
                    Tekstboxliste.Clear();
                    panel.Controls.Clear();
                }

                // AØ Opdater virksomhedsdata for pågældende kunde
                try
                {
                    if (cboFindKunde.SelectedIndex != -1)
                    {
                        OpdaterVirksomhedsdataBox(kunde.Kundenr);
                    }
                }
                catch
                {

                }
            }
        }

        //************************************************Jesper/Mads - FIND/HENT INSTALLATIONER********************************************
        private void cboVirkType_SelectedIndexChanged(object sender, EventArgs e)
        {
                Tekstboxliste.Clear();
                FyldTextBoxListe();
                if (cboVirkType.SelectedIndex != -1)
                {
                    ClearResultatBoxe();
                    btnOpretTilbud.Enabled = false;
                    btnBeregn.Enabled = true;

                    string navn = Convert.ToString(cboVirkType.SelectedItem);

                    List<IInstallation> instListe = VandspareSystem.HentInstallationer(navn);

                    for (int i = 0; i < instListe.Count; i++)
                    {
                        Tekstboxliste.Add(new modul(instListe[i].Betegnelse));
                        double forbrugProcent = instListe[i].Forbrugspct;

                        for (int j = (6 + i); j < (7 + i); j++)
                        {
                            (Tekstboxliste[j].txt.Text) = Convert.ToString(forbrugProcent);
                        }
                    }
                    
                    IVirksomhedsdata IaktuelVirksomhedsData = VandspareSystem.hentVirksomhedsData(navn);
                    (Tekstboxliste[0].txt.Text) = Convert.ToString(IaktuelVirksomhedsData.Antalpersoner);
                    (Tekstboxliste[1].txt.Text) = Convert.ToString(IaktuelVirksomhedsData.Nuvaereneforbrug);
                    (Tekstboxliste[2].txt.Text) = Convert.ToString(IaktuelVirksomhedsData.Forbrugmeddyse);
                    (Tekstboxliste[3].txt.Text) = Convert.ToString(IaktuelVirksomhedsData.Sidsteaarsforbrug);
                    (Tekstboxliste[4].txt.Text) = Convert.ToString(IaktuelVirksomhedsData.Vandpris);
                    (Tekstboxliste[5].txt.Text) = Convert.ToString(IaktuelVirksomhedsData.Vandafgift);

                    loadmoduler();
                }
            }
        

        private void btnVirkType_Click(object sender, EventArgs e)
        {
            // AØ tager kundenr fra aktuel kunde
            int kundenr = VandspareSystem.aktuelKunde.Kundenr;

            FrmVirksomhedsType frmVirksomhedsType = new FrmVirksomhedsType(kundenr, VandspareSystem);
            frmVirksomhedsType.ShowDialog();
            if (frmVirksomhedsType.DialogResult == DialogResult.OK)
            {
                valgtKunde();
                this.BringToFront();
            }
        }

        private void virksomhedstypeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int kundenr = 0;
            FrmVirksomhedsType frmVirksomhedsType = new FrmVirksomhedsType(kundenr,VandspareSystem);
            frmVirksomhedsType.ShowDialog();

            if (frmVirksomhedsType.DialogResult == DialogResult.OK)
            {


                btnOpretTilbud.Enabled = false;
                btnBeregn.Enabled = false;
                cboVirkType.Enabled = false;
                btnVirkType.Enabled = false;
                cboVirkType.SelectedIndex = -1;
                ClearResultatBoxe();
                if (btnVirkType.Enabled == true)
                {
                    Tekstboxliste.Clear();
                }
                ClearKundeBoxe();
                panel.Controls.Clear();
                cboFindKunde.SelectedIndex = -1;
                cboVirkType.SelectedIndex = -1;
                this.BringToFront();
            }
            this.BringToFront(); 
        }


        private void databaseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            new FrmDatabase(VandspareSystem.info).ShowDialog();
        }


        private void timerTestDB_Tick(object sender, EventArgs e)
        {
            tjekDB = new Thread(new ThreadStart(this.TestDB));
            tjekDB.Start(); 
            Thread.Sleep(1);
        }


        private void TestDB()
        {
            if (VandspareSystem.CheckDBForbindelse())
                lblStatus.Text = "Klar";
            else lblStatus.Text = "Fejl!: Kan ikke forbinde til databasen";
        }


        private void startBeregningToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnOpretTilbud.Enabled = false;
            btnBeregn.Enabled = false;
            cboVirkType.Enabled = false;
            btnVirkType.Enabled = false;
            cboVirkType.SelectedIndex = -1;
            ClearResultatBoxe();
            if (btnVirkType.Enabled == true)
            {
                Tekstboxliste.Clear();
            }
            ClearKundeBoxe();
            panel.Controls.Clear();
            cboFindKunde.SelectedIndex = -1;
            cboVirkType.SelectedIndex = -1;
        }


        private void FrmUdregner_FormClosing(object sender, FormClosingEventArgs e)
        {
            
        }
    }
}
